perm filename VIXFAI.FAI[VIS,HPM]15 blob sn#501223 filedate 1980-03-06 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00022 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002		TITLE	VIXFAI
C00004 00003	X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D ↔ BT←ARRY2
C00008 00004	GRYUP:	0
C00009 00005	TONUP:	0
C00010 00006	TABLES FOR FRACTIONATING ERRORS FOR THE HALFTONE ALGORITHM
C00013 00007		TITLE	VIXFA1
C00016 00008	TONUP:	0
C00019 00009	******************** SAIL INTERFACE ***********************
C00023 00010	ARRY←5 ↔ X1←1 ↔ Y1←2 ↔ X2←3 ↔ Y2←4 ↔ BT←0 ↔ XA←6 ↔ YA←7
C00029 00011		TITLE	VIDONE
C00033 00012		TITLE	VIDFOR
C00036 00013		TITLE	VID1
C00038 00014		TITLE	VID3
C00041 00015		TITLE	VID4
C00044 00016		TITLE	VID5
C00047 00017		TITLE	VIDFRX
C00050 00018		TITLE	VIDFGX
C00054 00019		TITLE	VIDFRT
C00058 00020		TITLE	VIDXGP
C00061 00021		TITLE	VIDXG
C00064 00022	        TITLE	XGEROR
C00065 ENDMK
C⊗;
	TITLE	VIXFAI
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VID

DWINXL:	0
DWINYL:	0
DWINXH:	20*40-2
DWINYH:	740-1

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

	T←1  ↔  TT←2  ↔  TTT←3  ↔  ARRY1←4  ↔  ARRY2←5  ↔  P←17
	A←6  ↔  B←7  ↔  C←10  ↔  D←11  ↔  E←13  ↔  F←14  ↔  G←15

RETAD:	0
TEMP:	BLOCK	25		;TEMPORARY STORAGE FOR STUFF

	DEFINE	FLOAT(N)
<	TLC	N,232000
	FADR	N,N	>

	OPDEF	FIX[247000233000]
X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D ↔ BT←ARRY2
THIS←←TT ↔ SIZ←←TTT

XCNTR←←TEMP ↔ YCNTR←←TEMP+1 ↔ DELX←←TEMP+2 ↔ DELY←←TEMP+3
PICX←←TEMP+4 ↔ PICY←←TEMP+5 ↔ DDLIN←←TEMP+6 ↔ LINB←←TEMP+7

VID:	POP	P,RETAD		;PUT UP BITS BT (A MASK, USUALLY ONLY ONE BIT
	POP	P,BT		;IS ON, IF MULTIPLE BITS ARE ON, THEY ARE OR'D)
	POP	P,ARRY1		;OF PICTURE PIC INTO DD RECTANGLE X1-X2,Y1-Y2
	POP	P,Y2		; VIDEO(X1,Y1,X2,Y2,PIC,BT)
	FSBR	Y2,YH		;IF BT IS -1,
	FMPR	Y2,YSC		;PUT UP A RANDOM DOT REPRESENTATION INSTEAD
	FIX	Y2,
	POP	P,X2
	FSBR	X2,XL
	FMPR	X2,XSC
	FIX	X2,
	POP	P,Y1
	FSBR	Y1,YH
	FMPR	Y1,YSC
	FIX	Y1,
	POP	P,X1
	FSBR	X1,XL
	FMPR	X1,XSC
	FIX	X1,

	CAML	X1,X2			;PUT UP THE BITS MASKED BY BT
	EXCH	X1,X2			;OF PICTURE ARRY IN DD BUFFER
	CAML	Y1,Y2			;RECTANGLE X1-X2, Y1-Y2
	EXCH	Y1,Y2
	HRREI	T,1(X2)			;CALCULATE WIDTH AND HEIGHT,
	SUB	T,X1			;IN DATA DISC PIXELS,
	MOVEM	T,XCNTR			;OF THE FULL PICTURE
	HRREI	T,1(Y2)
	SUB	T,Y1			;THEN CALCULATE THE
	MOVEM	T,YCNTR			;STEP SIZE THROUGH THE ORIGINAL
	HRLZ	T,LNBY(ARRY1)		;PICTURE EACH DD PIXEL REPRESENTS,
	IDIV	T,XCNTR			;AS A FIXED POINT WRD WITH THE
	MOVEM	T,DELX			;RADIX POINT IN THE MIDDLE
	HRLZ	T,PCLN(ARRY1)
	IDIV	T,YCNTR
	MOVEM	T,DELY

	SETZ	PICY
	CAML	Y1,DWINYL		;CHECK IF LOWER AND UPPER
	JRST	YLOK
	MOVN	T,Y1			;BOUNDS OF THE IMAGE EXCEED THE
	IMUL	T,DELY			;EXTERNAL WINDOWING CONSTRAINTS
	MOVEM	T,PICY
	MOVE	Y1,DWINYL
YLOK:	CAMLE	Y2,DWINYH
	MOVE	Y2,DWINYH

	SETZ	PICX
	CAML	X1,DWINXL
	JRST	XLOK
	MOVN	T,X1
	IMUL	T,DELX
	MOVEM	T,PICX
	MOVE	X1,DWINXL
XLOK:	CAMLE	X2,DWINXH
	MOVE	X2,DWINXH

	CAMG	X1,X2			;IF THIS PROCESS LEAVES NOTHING,
	CAMLE	Y1,Y2			;WE CAN QUIT
	JRST	@RETAD

	SUBM	X1,X2			;GENERATE LOOP COUNTERS
	SUBM	Y1,Y2
	HRLI	X1,-1(X2)
	HRLI	Y1,-1(Y2)

	HLRE	SIZ,Y1
	MOVN	SIZ,SIZ			;RESERVE SPACE FOR BYTE PNTR TABLE
	PUSHJ	P,CORGET
	HALT
	MOVEM	THIS,DDLIN

	MOVE	E,DELY
	MOVE	T,Y1			;GENERATE TABLE OF LINE ADDRESSES
	HRR	T,DDLIN
	HRLZI	TT,LINTAB(ARRY1)
	ADD	TT,PICY

YLLP:	HLRZ	TTT,TT			;INTO THE ACTUAL PICTURE COLUMNS WHICH
RTF:	MOVE	TTT,(TTT)		;CORRESPOND TO DD COLUMNS
	MOVEM	TTT,(T)
	ADD	TT,E
	AOBJN	T,YLLP

	CAMN	BT,[-1]
	JRST	[	JSR	TONUP
			JRST	DONE  ]
	CAMN	BT,[-2]
	JRST	[	JSR	HAFUP
			JRST	DONE  ]
	JSR	GRYUP

DONE:	MOVE	THIS,DDLIN
	PUSHJ	P,CORREL
	JRST	@RETAD
GRYUP:	0
	HRRM	BT,TI
	MOVN	T,Y1
	ADD	T,DDLIN
	HRRM	T,YLP

	HRLZ	E,BPTAB(ARRY1)
	ADD	E,PICX

XLP:	HRRZ	T,X1
	LSH	T,-5
	ADD	T,[ORM F,DBUF(TT)]
	HRRM	T,TJ
	HRRZ	F,X1
	ANDI	F,37
	MOVE	F,BSK(F)
	MOVE	T,Y1
	HLRZ	TTT,E
	MOVE	TTT,(TTT)
	TLO	TTT,TT			;SET UP INDEX FIELD IN BYTE PNTR

YLP:	MOVE	TT,(T)			;ALTERED TO REFERENCE THE DDLIN TABLE
	LDB	0,TTT
	MOVE	TT,SLINE(T)
TI:	TRNE	0,BT			;REPLACED BY ACTUAL MASK
TJ:	ORM	F,DBUF(TT)		;ADD WORD NUMBER WITHIN SCANLINE
	AOBJN	T,YLP

	ADD	E,DELX
	AOBJN	X1,XLP
	JRST	@GRYUP
TONUP:	0
	MOVN	BT,BYBI(ARRY1)
	SUBI	BT,1
	HRRM	BT,TI1
	MOVEI	BT,77753

	MOVN	T,Y1
	ADD	T,DDLIN
	HRRM	T,YLP1

	HRLZ	E,BPTAB(ARRY1)
	ADD	E,PICX

XLP1:	HRRZ	T,X1
	LSH	T,-5
	ADD	T,[ORM F,DBUF(TT)]
	HRRM	T,TJ1
	HRRZ	F,X1
	ANDI	F,37
	MOVE	F,BSK(F)
	MOVE	T,Y1
	HLRZ	TTT,E
	MOVE	TTT,(TTT)
	TLO	TTT,TT			;SET UP INDEX FIELD IN BYTE PNTR

YLP1:	MOVE	TT,(T)			;ALTERED TO REFERENCE THE DDLIN TABLE
	LDB	0,TTT
	MOVE	TT,SLINE(T)
TI1:	ROT	0,-5			;REPLACED BY ACTUAL MASK
	IMULI	BT,400003
	CAMLE	0,BT
TJ1:	ORM	F,DBUF(TT)		;ADD WORD NUMBER WITHIN SCANLINE
	AOBJN	T,YLP1

	ADD	E,DELX
	AOBJN	X1,XLP1
	JRST	@TONUP
;TABLES FOR FRACTIONATING ERRORS FOR THE HALFTONE ALGORITHM

	FOR I←-20,-1,1  {   (3*I+10)/20
					}
T1:	FOR I←0,40,1    {   (3*I+10)/20
					}

	FOR I←-20,-1,1  {   (5*I+10)/20
					}
T2:	FOR I←0,40,1    {   (5*I+10)/20
					}

	FOR I←-20,-1,1  {    (I+10)/20
					}
T3:	FOR I←0,40,1    {    (I+10)/20
					}

	FOR I←-20,-1,1  {I-(((3*I+10)/20)+((5*I+10)/20)+((I+10)/20))
								}
T4:	FOR I←0,40,1    {I-(((3*I+10)/20)+((5*I+10)/20)+((I+10)/20))
								}



HAFUP:	0				;HIGH QUALITY HALFTONES
	HLRE	SIZ,Y1
	MOVN	SIZ,SIZ
	ADDI	SIZ,2
	PUSHJ	P,CORGET
	HALT
	SETZ	(THIS)			;RESERVE AND CLEAR A
	HRL	0,THIS			;LINE BUFFER
	HRRI	0,1(THIS)
	MOVEI	T,-1(THIS)
	ADD	T,SIZ
	BLT	0,(T)

	MOVEM	THIS,LINB		;CREATE REFERENCES TO THE
	SUBI	THIS,(Y1)		;LINE BUFFER
	HRRM	THIS,LBM1
	ADDI	THIS,1
	HRRM	THIS,LB
	ADDI	THIS,1
	HRRM	THIS,LBP1

	MOVN	T,Y1
	ADD	T,DDLIN
	HRRM	T,YLP2

	MOVN	T,BYBI(ARRY1)		;SET UP SHIFT COUNT
	ADDI	T,4			;FOR REDUCTION OF PIXELS
	HRRM	T,SHIF			;TO FOUR BITS

	HRLZ	E,BPTAB(ARRY1)
	ADD	E,PICX

XLP2:	HRRZ	T,X1
	LSH	T,-5
	ADD	T,[ORM F,DBUF(TT)]
	HRRM	T,TJ2
	HRRZ	F,X1
	ANDI	F,37
	MOVE	F,BSK(F)
	MOVE	T,Y1
	HLRZ	TTT,E
	MOVE	TTT,(TTT)
	TLO	TTT,TT			;SET UP INDEX FIELD IN BYTE PNTR

	SETZB	C,D
YLP2:	MOVE	TT,(T)			;ALTERED TO REFERENCE THE DDLIN TABLE
	LDB	0,TTT
SHIF:	LSH	0,0			;STRIP IT TO FOUR BITS
	ADD	C,0
	ADD	C,D
	CAIGE	C,10
	JRST	NOTDOT
	MOVE	TT,SLINE(T)
TJ2:	ORM	F,DBUF(TT)		;ADD WORD NUMBER WITHIN SCANLINE
	SUBI	C,17
NOTDOT:	CAMGE	C,[-20]
FOOL:	MOVE	C,[-20]
	CAILE	C,40
FOOG:	MOVEI	C,40
	MOVE	D,T4(C)
	MOVE	0,T1(C)
LBM1:	ADDM	0,-1(T)			;CHANGED TO LINE BUFFER-1
	MOVE	0,T2(C)
LB:	ADDM	0,(T)			;CHANGED TO LINE BUFFER
	MOVE	C,T3(C)
LBP1:	EXCH	C,1(T)			;CHANGED TO LINE BUFFER+1
	AOBJN	T,YLP2

	ADD	E,DELX
	AOBJN	X1,XLP2

	MOVE	THIS,LINB
	PUSHJ	P,CORREL

	JRST	@HAFUP

	PRGEND
	TITLE	VIXFA1
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VIDEO

ARRY←5 ↔ X1←1 ↔ Y1←2 ↔ X2←3 ↔ Y2←4 ↔ BT←0 ↔ XA←6 ↔ YA←7
DX←10 ↔ DY←11 ↔ PICX←12 ↔ PICY←13 ↔ XBIT←14 ↔ XPIC←15 ↔ YPIC←16 ↔ T←17

SCRTCH:	BLOCK	1000

GRYUP:	0
	MOVE	T,ROWTAB
	HRRM	T,RTF
	MOVE	T,COLTAB
	HRRM	T,CTF
	HRRM	BT,TI
	CAML	X1,X2			;PUT UP THE BITS MASKED BY BT
	EXCH	X1,X2			;OF PICTURE ARRY IN DD BUFFER
	CAML	Y1,Y2			;RECTANGLE X1-X2, Y1-Y2
	EXCH	Y1,Y2
	HRREI	XA,1(X2)
	SUB	XA,X1
	HRREI	YA,1(Y2)
	SUB	YA,Y1
	HRLZ	DX,PICWID
	IDIV	DX,XA
	HRLZ	DY,PICHIG
	IDIV	DY,YA
	SETZB	PICY,PICX
	JUMPGE	Y1,YLOK			;CHECK IF LOWER AND UPPER
	MOVN	PICY,Y1			;BOUNDS NEED FIXING UP
	IMUL	PICY,DY
	SETZ	Y1,
YLOK:	CAILE	Y2,737
	MOVEI	Y2,737
	JUMPGE	X1,XLOK
	MOVN	PICX,X1
	IMUL	PICX,DX
	SETZ	X1,
XLOK:	CAIL	X2,20*40-1
	MOVEI	X2,20*40-2
	CAMG	X1,X2
	CAMLE	Y1,Y2
	JRST	@GRYUP
	SUBM	X1,X2
	SUBM	Y1,Y2
	HRLI	X1,-1(X2)
	HRLI	Y1,-1(Y2)
	MOVE	YA,Y1
YLLP:	HLRZ	YPIC,PICY
RTF:	MOVE	YPIC,ROWTAB(YPIC)
	MOVEM	YPIC,SCRTCH(YA)
	ADD	PICY,DY
	AOBJN	YA,YLLP

XLP:	HRRZ	XA,X1
	HRRZ	XBIT,X1
	LSH	XA,-5
	ADD	XA,[ORM XBIT,DBUF(YPIC)]
	HRRM	XA,TJ
	ANDI	XBIT,37
	MOVE	XBIT,BSK(XBIT)
	MOVE	YA,Y1
	HLRZ	XPIC,PICX
CTF:	MOVE	XPIC,COLTAB(XPIC)
	TLO	XPIC,YPIC		;SET UP INDEX FIELD IN BYTE PNTR

YLP:	MOVE	YPIC,SCRTCH(YA)
	LDB	T,XPIC
	MOVE	YPIC,SLINE(YA)
TI:	TRNE	T,BT			;REPLACED BY ACTUAL MASK
TJ:	ORM	XBIT,DBUF(YPIC)		;ADD WORD NUMBER WITHIN SCANLINE
	AOBJN	YA,YLP

	ADD	PICX,DX
	AOBJN	X1,XLP
	JRST	@GRYUP
TONUP:	0
	MOVE	T,ROWTAB
	HRRM	T,RTF1
	MOVE	T,COLTAB
	HRRM	T,CTF1
	MOVN	BT,PICBIT
	SUBI	BT,1
	HRRM	BT,TIH
	MOVEI	BT,737373
	CAML	X1,X2			;PUT UP THE
	EXCH	X1,X2			;PICTURE ARRY IN DD BUFFER
	CAML	Y1,Y2			;RECTANGLE X1-X2, Y1-Y2
	EXCH	Y1,Y2			;AS A RANDOM DOT PATTERN
	HRREI	XA,1(X2)
	SUB	XA,X1
	HRREI	YA,1(Y2)
	SUB	YA,Y1
	HRLZ	DX,PICWID
	IDIV	DX,XA
	HRLZ	DY,PICHIG
	IDIV	DY,YA
	SETZB	PICY,PICX
	JUMPGE	Y1,YLOKH		;CHECK IF LOWER AND UPPER
	MOVN	PICY,Y1			;BOUNDS NEED FIXING UP
	IMUL	PICY,DY
	SETZ	Y1,
YLOKH:	CAILE	Y2,740
	MOVEI	Y2,740
	JUMPGE	X1,XLOKH
	MOVN	PICX,X1
	IMUL	PICX,DX
	SETZ	X1,
XLOKH:	CAIL	X2,20*40-1
	MOVEI	X2,20*40-2
	CAMG	X1,X2
	CAMLE	Y1,Y2
	JRST	@TONUP
	SUBM	X1,X2
	SUBM	Y1,Y2
	HRLI	X1,-1(X2)
	HRLI	Y1,-1(Y2)
	MOVE	YA,Y1
YLLPH:	HLRZ	YPIC,PICY
RTF1:	MOVE	YPIC,ROWTAB(YPIC)
	MOVEM	YPIC,SCRTCH(YA)
	ADD	PICY,DY
	AOBJN	YA,YLLPH

XLPH:	HRRZ	XA,X1
	HRRZ	XBIT,X1
	LSH	XA,-5
	ADD	XA,[ORM XBIT,DBUF(YPIC)]
	HRRM	XA,TJH
	ANDI	XBIT,37
	MOVE	XBIT,BSK(XBIT)
	MOVE	YA,Y1
	HLRZ	XPIC,PICX
CTF1:	MOVE	XPIC,COLTAB(XPIC)
	TLO	XPIC,YPIC		;SET UP INDEX FIELD IN BYTE PNTR

YLPH:	MOVE	YPIC,SCRTCH(YA)
	LDB	T,XPIC
TIH:	ROT	T,-5			;REPLACED BY -PICBIT-1
	MOVE	YPIC,SLINE(YA)
        IMULI	BT,400003
	CAMLE	T,BT			;REPLACED BY ACTUAL MASK
TJH:	ORM	XBIT,DBUF(YPIC)		;ADD WORD NUMBER WITHIN SCANLINE
	AOBJN	YA,YLPH

	ADD	PICX,DX
	AOBJN	X1,XLPH
	JRST	@TONUP
;******************** SAIL INTERFACE ***********************
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←←13
LINTAB←←14

PICWID:	0
PICLIN:	0
PICHIG:	0
PICBIT:	0
PICWIZ:	0
PICSIZ:	0
COLTAB:	0
ROWTAB:	0

SETUP:	0
	MOVE	T,PCWD(ARRY)		;SET "GLOBALS" FOR COMPATABILITY WITH
	MOVEM	T,PICSIZ		;OLD FORMAT
	MOVE	T,LNBYA(ARRY)
	MOVEM	T,PICWIZ
	MOVE	T,BYBI(ARRY)
	MOVEM	T,PICBIT
	MOVE	T,PCLN(ARRY)
	MOVEM	T,PICHIG
	MOVE	T,LNWD(ARRY)
	MOVEM	T,PICLIN
	MOVE	T,LNBY(ARRY)
	MOVEM	T,PICWID
	MOVE	T,BPTAB(ARRY)
	MOVEM	T,COLTAB
	MOVEI	T,LINTAB(ARRY)
	MOVEM	T,ROWTAB
	MOVE	ARRY,(T)
	JRST	@SETUP


	P←17

	DEFINE	FLOAT(N)
<	TLC	N,232000
	FADR	N,N	>

	OPDEF	FIX[247000233000]

	DEFINE	SAVAC(N)
<	IFGE	N-12,{MOVEM 12,ACS12}
	IFGE	N-16,{MOVEM 16,ACS16}
	IFGE	N-17,{MOVEM 17,ACS17}	>


	DEFINE	RESAC(N)
<	IFGE	N-12,{MOVE 12,ACS12}
	IFGE	N-16,{MOVE 16,ACS16}
	IFGE	N-17,{MOVE 17,ACS17}	>

RETAD:	0
ACS12:	0
ACS16:	0
ACS17:	0
GOODFL:	0
BUGGFL:	0

VIDEO:	POP	P,RETAD		;PUT UP BITS BT (A MASK, USUALLY ONLY ONE BIT
	POP	P,BT		;IS ON, IF MULTIPLE BITS ARE ON, THEY ARE OR'D)
	POP	P,ARRY		;OF PICTURE PIC INTO DD RECTANGLE X1-X2,Y1-Y2
	POP	P,Y2		; VIDEO(X1,Y1,X2,Y2,PIC,BT)
	FSBR	Y2,YH		;IF BT IS -1,
	FMPR	Y2,YSC		;PUT UP A RANDOM DOT REPRESENTATION INSTEAD
	FIX	Y2,		;IF BT IS -2, A HIGH QUALITY HALFTONE
	POP	P,X2		;IF -3, A SLIGHTLY WORSE ONE
	FSBR	X2,XL
	FMPR	X2,XSC
	FIX	X2,
	POP	P,Y1
	FSBR	Y1,YH
	FMPR	Y1,YSC
	FIX	Y1,
	POP	P,X1
	FSBR	X1,XL
	FMPR	X1,XSC
	FIX	X1,
	SAVAC(17)
	JSR	SETUP
	SETZM	BUGGFL
	CAMN	BT,[-1]
	JRST	[	JSR	TONUP
			JRST	DONE  ]
	CAMN	BT,[-2]
	JRST	[	SETZM	GOODFL
			JSR	HAFUP
			JRST	DONE  ]
	CAMN	BT,[-3]
	JRST	[	SETOM	GOODFL
			JSR	HAFUP
			JRST	DONE  ]
	CAMN	BT,[-4]
	JRST	[	SETOM	BUGGFL
			SETZM	GOODFL
			JSR	HAFUP
			JRST	DONE  ]
	JSR	GRYUP
DONE:	RESAC(17)
	JRST	@RETAD
ARRY←5 ↔ X1←1 ↔ Y1←2 ↔ X2←3 ↔ Y2←4 ↔ BT←0 ↔ XA←6 ↔ YA←7
DX←10 ↔ DY←11 ↔ PICX←12 ↔ PICY←13 ↔ XBIT←14 ↔ XPIC←15 ↔ YPIC←16 ↔ T←17
THISS:	0
SIZS:	0
HAFUP:	0				;HIGH QUALITY HALFTONES
	MOVE	T,ROWTAB
	HRRM	T,RTF2
	MOVE	T,COLTAB
	HRRM	T,CTF2
	HRRM	T,CTF2A
	CAML	X1,X2			;PUT UP A HALFTONE
	EXCH	X1,X2			;OF PICTURE ARRY IN DD BUFFER
	CAML	Y1,Y2			;RECTANGLE X1-X2, Y1-Y2
	EXCH	Y1,Y2
	HRREI	XA,1(X2)
	SUB	XA,X1
	HRREI	YA,1(Y2)
	SUB	YA,Y1
	HRLZ	DX,PICWID
	IDIV	DX,XA
	HRLZ	DY,PICHIG
	IDIV	DY,YA
	SETZB	PICY,PICX
	JUMPGE	Y1,YLOK2		;CHECK IF LOWER AND UPPER
	MOVN	PICY,Y1			;BOUNDS NEED FIXING UP
	IMUL	PICY,DY
	SETZ	Y1,
YLOK2:	CAILE	Y2,740-1
	MOVEI	Y2,740-1
	JUMPGE	X1,XLOK2
	MOVN	PICX,X1
	IMUL	PICX,DX
	SETZ	X1,
XLOK2:	CAIL	X2,20*40-1
	MOVEI	X2,20*40-2
	CAMG	X1,X2
	CAMLE	Y1,Y2
	JRST	@HAFUP

LINA←←0 ↔ LINB←←0 ↔ HALFV←←0		;DUMMY NAMES FOR LINE BUFFER AND 1/2 PIXEL

THIS←Y1 ↔ SIZ←X2
	MOVEM	THIS,THISS		;SAVE THESE
	MOVEM	SIZ,SIZS		;ALLOCATE CORE FOR TWO LINE BUFFERS
	EXCH	P,ACS17
	MOVEI	SIZ,2000
	PUSHJ	P,CORGET
	HALT
	ADDI	THIS,2
	HRRM	THIS,LAAM		;SET UP LINE BUFFER REFERENCES
	ADDI	THIS,1
	HRRM	THIS,LBA
	HRRM	THIS,LAA
	ADDI	THIS,1
	HRRM	THIS,LAAP
	HRRM	THIS,LBAP
	ADDI	THIS,1000
	HRRM	THIS,LABM
	ADDI	THIS,1
	HRRM	THIS,LBB
	HRRM	THIS,LAB
	ADDI	THIS,1
	HRRM	THIS,LABP
	HRRM	THIS,LBBP
	SUBI	THIS,1006
	SETZM	(THIS)
	HRL	BT,THIS
	HRRI	BT,1(THIS)
	BLT	BT,1777(THIS)
	EXCH	THIS,THISS
	MOVE	SIZ,SIZS
	EXCH	P,ACS17

	MOVEI	BT,1				;BYTE WIDTH CALCULATION
	LSH	BT,@PICBIT
	SUBI	BT,1
	HRRM	BT,LBH
	HRRM	BT,LDH
	ADDI	BT,1
	LSH	BT,-1
	HLL	BT,[CAIGE BT,0]  ;arty bug option
        SKIPE	BUGGFL
	HLL	BT,[TRNN BT,0]
	MOVEM	BT,LAH
	MOVEM	BT,LCH

	SUBM	X1,X2
	SUBM	Y1,Y2
	HRLI	X1,-1(X2)
	HRLI	Y1,-1(Y2)
	MOVE	YA,Y1
YLLP2:	HLRZ	YPIC,PICY
RTF2:	MOVE	YPIC,ROWTAB(YPIC)
	MOVEM	YPIC,SCRTCH(YA)
	ADD	PICY,DY
	AOBJN	YA,YLLP2

XLP2:	HRRZ	XA,X1
	HRRZ	XBIT,X1
	LSH	XA,-5
	ADD	XA,[ORM XBIT,DBUF(YPIC)]
	HRRM	XA,TJ2
	ANDI	XBIT,37
	MOVE	XBIT,BSK(XBIT)
	MOVE	YA,Y1
	HLRZ	XPIC,PICX
CTF2:	MOVE	XPIC,COLTAB(XPIC)
	TLO	XPIC,YPIC		;SET UP INDEX FIELD IN BYTE PNTR

YLP2:	MOVE	YPIC,SCRTCH(YA)
	LDB	T,XPIC
	SETZ	BT,
LAA:	EXCH	BT,LINA(YA)		;CHANGED TO LINA
	ADD	BT,T
LAH:	CAIGE	BT,HALFV		;CHANGED TO ACTUAL 1/2 MAX PIXEL VALUE
	JRST	GTH
	MOVE	YPIC,SLINE(YA)
TJ2:	ORM	XBIT,DBUF(YPIC)		;ADD WORD NUMBER WITHIN SCANLINE
LBH:	SUBI	BT,HALFV
GTH:	MOVE	T,BT
	ASH	BT,-2
LABM:	ADDM	BT,LINB-1(YA)		;CHNGED TO ACTUAL ADDR-1 OF LINB BUFFER
LAB:	ADDM	BT,LINB(YA)
	SUB	T,BT
	SUB	T,BT
  SKIPE GOODFL
  JRST  LAAP
	ASH	BT,-1
LABP:	ADDM	BT,LINB+1(YA)
	SUB	T,BT
LAAP:	ADDM	T,LINA+1(YA)
	AOBJN	YA,YLP2
					;POSSIBLE PATTERNS ARE
					;     *  7        *  3        *  2
					;  3  5  1     2  2  1     1  1  0
	ADD	PICX,DX
	AOBJP	X1,ENDXL

XLP2A:	HRRZ	XA,X1
	HRRZ	XBIT,X1
	LSH	XA,-5
	ADD	XA,[ORM XBIT,DBUF(YPIC)]
	HRRM	XA,TI2
	ANDI	XBIT,37
	MOVE	XBIT,BSK(XBIT)
	MOVE	YA,Y1
	HLRZ	XPIC,PICX
CTF2A:	MOVE	XPIC,COLTAB(XPIC)
	TLO	XPIC,YPIC		;SET UP INDEX FIELD IN BYTE PNTR

YLP2A:	MOVE	YPIC,SCRTCH(YA)
	LDB	T,XPIC
	SETZ	BT,
LBB:	EXCH	BT,LINB(YA)		;CHANGED TO LINA
	ADD	BT,T
LCH:	CAIGE	BT,HALFV		;CHANGED TO ACTUAL 1/2 MAX PIXEL VALUE
	JRST	GTH1
	MOVE	YPIC,SLINE(YA)
TI2:	ORM	XBIT,DBUF(YPIC)		;ADD WORD NUMBER WITHIN SCANLINE
LDH:	SUBI	BT,HALFV
GTH1:	MOVE	T,BT
	ASH	BT,-2
LAAM:	ADDM	BT,LINA-1(YA)		;CHNGED TO ACTUAL ADDR-1 OF LINB BUFFER
LBA:	ADDM	BT,LINA(YA)
	SUB	T,BT
	SUB	T,BT
  SKIPE GOODFL
  JRST  LBBP
	ASH	BT,-1
LBAP:	ADDM	BT,LINA+1(YA)
	SUB	T,BT
LBBP:	ADDM	T,LINB+1(YA)
	AOBJN	YA,YLP2A

	ADD	PICX,DX
	AOBJN	X1,XLP2

ENDXL:	MOVE	P,ACS17
	MOVE	THIS,THISS
	PUSHJ	P,CORREL

	JRST	@HAFUP

	PRGEND
	TITLE	VIDONE
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VIDONE

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

P←17 ↔ MASK←1 ↔ PIC←2 ↔ Y←3 ↔ LBP←4 ↔ BP←5 ↔ T←6 ↔ TT←7 ↔ YY←10 ↔ PWID←11
I0←13 ↔ J0←14

RETAD:	0

VIDONE:	POP	P,RETAD
	POP	P,J0
	POP	P,I0
	POP	P,MASK  	;FAST SYNTHESIZER CONVERSION. MASKS
	POP	P,PIC		;PICTURE TO DD PIXELS  ONE TO ONE
	MOVE	Y,PCLN(PIC)
	ADD	Y,I0
	CAILE	Y,741
	MOVEI	Y,741
	SUBM	I0,Y
	HRLZ	Y,Y
	ADD	Y,I0

	ASH	J0,-5
	MOVE	PWID,LNBY(PIC)
	ADDI	PWID,37
	ASH	PWID,-5
	ADD	PWID,J0
	CAILE	PWID,20
	MOVEI	PWID,20
	SUB	PWID,J0

	MOVN	PWID,PWID
	HRLZ	PWID,PWID
	ADD	PWID,J0

	MOVE	I0,LNBY(PIC)
	IDIVI	I0,40
	SKIPN	J0
	MOVEI	J0,40
	MOVN	T,J0
	SETO	I0,I0
	SETZ	J0,J0
	LSHC	I0,(T)
	SETO	I0,I0
	XOR	I0,J0
	
	MOVE	LBP,BPTAB(PIC)
	MOVE	LBP,-1(LBP)
	ADD	LBP,LINTAB(PIC)
	
YLOOP:	MOVE	YY,SLINE(Y)
	MOVE	BP,LBP
	ADD	LBP,LNWD(PIC)
	ADD	YY,PWID

	SKIPA
XLOOP:	MOVEM	TT,DBUF-1(YY)
	MOVE	TT,DBUF(YY)
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,400000
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,200000
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,100000
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,40000
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,20000
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,10000
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,4000
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,2000
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,1000
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,400
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,200
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,100
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,40
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,20
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,10
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,4
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,2
	ILDB	T,BP
	TDNE	T,MASK
	TLC	TT,1
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,400000
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,200000
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,100000
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,40000
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,20000
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,10000
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,4000
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,2000
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,1000
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,400
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,200
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,100
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,40
	ILDB	T,BP
	TDNE	T,MASK
	TRC	TT,20
	AOBJN	YY,XLOOP

	ANDM	I0,DBUF-1(YY)
	AND	TT,J0
	ORM	TT,DBUF-1(YY)

	AOBJN	Y,YLOOP

	JRST	@RETAD
	PRGEND
	TITLE	VIDFOR
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VIDFOR

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

P←17 ↔ T1←0 T2←1 ↔ PIC←2 ↔ Y←3 ↔ LBP←4 ↔ BP←5 ↔ T4←6 ↔ TT←7 ↔ YY←10 ↔ PWID←11
I0←13 ↔ J0←14 ↔ T8←15

RETAD:	0

VIDFOR:	POP	P,RETAD
	POP	P,J0
	POP	P,I0
	POP	P,T8
	HRRM	T8,BF8B
	POP	P,T4
	HRRM	T4,BF4B
	POP	P,T2
	HRRM	T2,BF2B
	POP	P,T1
	HRRM	T1,BF1B
				;SUPER FAST SYNTHESIZER CONVERSION. MASKS
	POP	P,PIC		;4 BIT PICTURE TO 4 DD BUFFERS ONE TO ONE
	MOVE	Y,PCLN(PIC)	;ASSUMES DIGITIZER INVERTED GRAY CODE
	ADD	Y,I0

	CAILE	Y,741
	MOVEI	Y,741
	SUB	Y,I0
	MOVN	Y,Y		;  VIDFOR(PIC[0],BF1,BF2,BF4,BF8,I0,J0)
	HRLZ	Y,Y
	ADD	Y,I0
	MOVE	PWID,LNBY(PIC)
	ADD	PWID,J0
	CAILE	PWID,1000
	MOVEI	PWID,1000
	SUB	PWID,J0
	ASH	PWID,-5
	MOVN	PWID,PWID
	HRLZ	PWID,PWID
	ASH	J0,-5
	ADD	PWID,J0
	
	MOVE	LBP,BPTAB(PIC)
	MOVE	LBP,-1(LBP)
	ADD	LBP,LINTAB(PIC)
	
YLOOP:	MOVE	YY,SLINE(Y)
	MOVE	BP,LBP
	ADD	LBP,LNWD(PIC)
	ADD	YY,PWID

XLOOP:	HRROI	T1,777762
	HRROI	T2,777762
	HRROI	T4,777762
	HRROI	T8,777762

   FOR C←21,0,-1
{	ILDB	TT,BP
	TRNE	TT,1
	TLZ	T1,1⊗C
	TRNE	TT,2
	TLZ	T2,1⊗C
	TRNE	TT,4
	TLZ	T4,1⊗C
	TRNE	TT,10
	TLZ	T8,1⊗C
 }

   FOR C←21,4,-1
{	ILDB	TT,BP
	TRNE	TT,1
	ANDCMI	T1,1⊗C
	TRNE	TT,2
	ANDCMI	T2,1⊗C
	TRNE	TT,4
	ANDCMI	T4,1⊗C
	TRNE	TT,10
	ANDCMI	T8,1⊗C
 }

BF1B:	MOVEM	T1,1(YY)
BF2B:	MOVEM	T2,2(YY)
BF4B:	MOVEM	T4,4(YY)
BF8B:	MOVEM	T8,8(YY)
	AOBJN	YY,XLOOP

	AOBJN	Y,YLOOP

	JRST	@RETAD
	PRGEND
	TITLE	VID1
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VID1

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

P←17 ↔ T1←0 ↔ PIC←2 ↔ Y←3 ↔ LBP←4 ↔ BP←5 ↔ TT←7 ↔ YY←10 ↔ PWID←11
I0←13 ↔ J0←14

RETAD:	0

VID1:	POP	P,RETAD
	POP	P,J0
	POP	P,I0
	POP	P,T1
	HRRM	T1,BF1B
				;SUPER FAST SYNTHESIZER CONVERSION. MASKS
	POP	P,PIC		;3 BIT PICTURE TO 3 DD BUFFERS ONE TO ONE
	MOVE	Y,PCLN(PIC)	;COMPLEMENTS REGULAR GRAY CODE
	ADD	Y,I0

	CAILE	Y,741
	MOVEI	Y,741
	SUB	Y,I0
	MOVN	Y,Y		;  VID3(PIC[0],BF1,BF2,BF4,I0,J0)
	HRLZ	Y,Y
	ADD	Y,I0
	MOVE	PWID,LNBY(PIC)
	ADD	PWID,J0
	CAILE	PWID,1000
	MOVEI	PWID,1000
	SUB	PWID,J0
	ASH	PWID,-5
	MOVN	PWID,PWID
	HRLZ	PWID,PWID
	ASH	J0,-5
	ADD	PWID,J0
	
	MOVE	LBP,BPTAB(PIC)
	MOVE	LBP,-1(LBP)
	ADD	LBP,LINTAB(PIC)
	
YLOOP:	MOVE	YY,SLINE(Y)
	MOVE	BP,LBP
	ADD	LBP,LNWD(PIC)
	ADD	YY,PWID

XLOOP:	HRROI	T1,777762

   FOR C←21,0,-1
{	ILDB	TT,BP
	TRNE	TT,1
	TLZ	T1,1⊗C
 }

   FOR C←21,4,-1
{	ILDB	TT,BP
	TRNE	TT,1
	ANDCMI	T1,1⊗C
 }

BF1B:	MOVEM	T1,1(YY)
	AOBJN	YY,XLOOP

	AOBJN	Y,YLOOP

	JRST	@RETAD
	PRGEND
	TITLE	VID3
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VID3

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

P←17 ↔ T1←0 T2←1 ↔ PIC←2 ↔ Y←3 ↔ LBP←4 ↔ BP←5 ↔ T4←6 ↔ TT←7 ↔ YY←10 ↔ PWID←11
I0←13 ↔ J0←14 ↔ T8←15

RETAD:	0

VID3:	POP	P,RETAD
	POP	P,J0
	POP	P,I0
	POP	P,T4
	HRRM	T4,BF4B
	POP	P,T2
	HRRM	T2,BF2B
	POP	P,T1
	HRRM	T1,BF1B
				;SUPER FAST SYNTHESIZER CONVERSION. MASKS
	POP	P,PIC		;3 BIT PICTURE TO 3 DD BUFFERS ONE TO ONE
	MOVE	Y,PCLN(PIC)	;COMPLEMENTS REGULAR GRAY CODE
	ADD	Y,I0

	CAILE	Y,741
	MOVEI	Y,741
	SUB	Y,I0
	MOVN	Y,Y		;  VID3(PIC[0],BF1,BF2,BF4,I0,J0)
	HRLZ	Y,Y
	ADD	Y,I0
	MOVE	PWID,LNBY(PIC)
	ADD	PWID,J0
	CAILE	PWID,1000
	MOVEI	PWID,1000
	SUB	PWID,J0
	ASH	PWID,-5
	MOVN	PWID,PWID
	HRLZ	PWID,PWID
	ASH	J0,-5
	ADD	PWID,J0
	
	MOVE	LBP,BPTAB(PIC)
	MOVE	LBP,-1(LBP)
	ADD	LBP,LINTAB(PIC)
	
YLOOP:	MOVE	YY,SLINE(Y)
	MOVE	BP,LBP
	ADD	LBP,LNWD(PIC)
	ADD	YY,PWID

XLOOP:	HRRZI	T1,000002
	HRRZI	T2,000002
	HRROI	T4,777762

   FOR C←21,0,-1
{	ILDB	TT,BP
	TRNE	TT,1
	TLO	T1,1⊗C
	TRNE	TT,2
	TLO	T2,1⊗C
	TRNE	TT,4
	TLZ	T4,1⊗C
 }

   FOR C←21,4,-1
{	ILDB	TT,BP
	TRNE	TT,1
	ORI	T1,1⊗C
	TRNE	TT,2
	ORI	T2,1⊗C
	TRNE	TT,4
	ANDCMI	T4,1⊗C
 }

BF1B:	MOVEM	T1,1(YY)
BF2B:	MOVEM	T2,2(YY)
BF4B:	MOVEM	T4,4(YY)
	AOBJN	YY,XLOOP

	AOBJN	Y,YLOOP

	JRST	@RETAD
	PRGEND
	TITLE	VID4
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VID4

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

P←17 ↔ T1←0 T2←1 ↔ PIC←2 ↔ Y←3 ↔ LBP←4 ↔ BP←5 ↔ T4←6 ↔ TT←7 ↔ YY←10 ↔ PWID←11
I0←13 ↔ J0←14 ↔ T8←15

RETAD:	0

VID4:	POP	P,RETAD
	POP	P,J0
	POP	P,I0
	POP	P,T8
	HRRM	T8,BF8B
	POP	P,T4
	HRRM	T4,BF4B
	POP	P,T2
	HRRM	T2,BF2B
	POP	P,T1
	HRRM	T1,BF1B
				;SUPER FAST SYNTHESIZER CONVERSION. MASKS
	POP	P,PIC		;4 BIT PICTURE TO 4 DD BUFFERS ONE TO ONE
	MOVE	Y,PCLN(PIC)	;COMPLEMENTS REGULAR GRAY CODE
	ADD	Y,I0

	CAILE	Y,741
	MOVEI	Y,741
	SUB	Y,I0
	MOVN	Y,Y		;  VID4(PIC[0],BF1,BF2,BF4,BF8,I0,J0)
	HRLZ	Y,Y
	ADD	Y,I0
	MOVE	PWID,LNBY(PIC)
	ADD	PWID,J0
	CAILE	PWID,1000
	MOVEI	PWID,1000
	SUB	PWID,J0
	ASH	PWID,-5
	MOVN	PWID,PWID
	HRLZ	PWID,PWID
	ASH	J0,-5
	ADD	PWID,J0
	
	MOVE	LBP,BPTAB(PIC)
	MOVE	LBP,-1(LBP)
	ADD	LBP,LINTAB(PIC)
	
YLOOP:	MOVE	YY,SLINE(Y)
	MOVE	BP,LBP
	ADD	LBP,LNWD(PIC)
	ADD	YY,PWID

XLOOP:	HRRZI	T1,000002
	HRRZI	T2,000002
	HRRZI	T4,000002
	HRROI	T8,777762

   FOR C←21,0,-1
{	ILDB	TT,BP
	TRNE	TT,1
	TLO	T1,1⊗C
	TRNE	TT,2
	TLO	T2,1⊗C
	TRNE	TT,4
	TLO	T4,1⊗C
	TRNE	TT,10
	TLZ	T8,1⊗C
 }

   FOR C←21,4,-1
{	ILDB	TT,BP
	TRNE	TT,1
	ORI	T1,1⊗C
	TRNE	TT,2
	ORI	T2,1⊗C
	TRNE	TT,4
	ORI	T4,1⊗C
	TRNE	TT,10
	ANDCMI	T8,1⊗C
 }

BF1B:	MOVEM	T1,1(YY)
BF2B:	MOVEM	T2,2(YY)
BF4B:	MOVEM	T4,4(YY)
BF8B:	MOVEM	T8,10(YY)
	AOBJN	YY,XLOOP

	AOBJN	Y,YLOOP

	JRST	@RETAD
	PRGEND
	TITLE	VID5
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VID5

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

P←17 ↔ T1←0 T2←1 ↔ PIC←2 ↔ Y←3 ↔ LBP←4 ↔ BP←5 ↔ T4←6 ↔ TT←7 ↔ YY←10 ↔ PWID←11
T16←I0←13 ↔ J0←14 ↔ T8←15

RETAD:	0

VID5:	POP	P,RETAD
	POP	P,J0
	POP	P,I0
	POP	P,T8
	HRRM	T8,BF16B
	POP	P,T8
	HRRM	T8,BF8B
	POP	P,T4
	HRRM	T4,BF4B
	POP	P,T2
	HRRM	T2,BF2B
	POP	P,T1
	HRRM	T1,BF1B
				;SUPER FAST SYNTHESIZER CONVERSION. MASKS
	POP	P,PIC		;4 BIT PICTURE TO 4 DD BUFFERS ONE TO ONE
	MOVE	Y,PCLN(PIC)	;COMPLEMENTS REGULAR GRAY CODE
	ADD	Y,I0

	CAILE	Y,741
	MOVEI	Y,741
	SUB	Y,I0
	MOVN	Y,Y		;  VID5(PIC[0],BF1,BF2,BF4,BF8,BF16,I0,J0)
	HRLZ	Y,Y
	ADD	Y,I0
	MOVE	PWID,LNBY(PIC)
	ADD	PWID,J0
	CAILE	PWID,1000
	MOVEI	PWID,1000
	SUB	PWID,J0
	ASH	PWID,-5
	MOVN	PWID,PWID
	HRLZ	PWID,PWID
	ASH	J0,-5
	ADD	PWID,J0
	
	MOVE	LBP,BPTAB(PIC)
	MOVE	LBP,-1(LBP)
	ADD	LBP,LINTAB(PIC)
	
YLOOP:	MOVE	YY,SLINE(Y)
	MOVE	BP,LBP
	ADD	LBP,LNWD(PIC)
	ADD	YY,PWID

XLOOP:	HRRZI	T1,000002
	HRRZI	T2,000002
	HRRZI	T4,000002
	HRRZI	T8,000002
	HRROI	T16,777762

   FOR C←21,0,-1
{	ILDB	TT,BP
	TRNE	TT,1
	TLO	T1,1⊗C
	TRNE	TT,2
	TLO	T2,1⊗C
	TRNE	TT,4
	TLO	T4,1⊗C
	TRNE	TT,10
	TLO	T8,1⊗C
	TRNE	TT,20
	TLZ	T16,1⊗C
 }

   FOR C←21,4,-1
{	ILDB	TT,BP
	TRNE	TT,1
	ORI	T1,1⊗C
	TRNE	TT,2
	ORI	T2,1⊗C
	TRNE	TT,4
	ORI	T4,1⊗C
	TRNE	TT,10
	ORI	T8,1⊗C
	TRNE	TT,20
	ANDCMI	T16,1⊗C
 }

BF1B:	MOVEM	T1,1(YY)
BF2B:	MOVEM	T2,2(YY)
BF4B:	MOVEM	T4,4(YY)
BF8B:	MOVEM	T8,10(YY)
BF16B:	MOVEM	T16,20(YY)
	AOBJN	YY,XLOOP

	AOBJN	Y,YLOOP

	JRST	@RETAD
	PRGEND
	TITLE	VIDFRX
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VIDFRX

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

P←17 ↔ T1←0 T2←1 ↔ PIC←2 ↔ Y←3 ↔ LBP←4 ↔ BP←5 ↔ T4←6 ↔ TT←7 ↔ YY←10 ↔ PWID←11
YY1←I0←13 ↔ J0←14 ↔ T8←15

RETAD:	0

VIDFRX:	POP	P,RETAD
	POP	P,J0
	POP	P,I0
	POP	P,T8
	HRRM	T8,BF8A
	HRRM	T8,BF8B
	POP	P,T4
	HRRM	T4,BF4A
	HRRM	T4,BF4B
	POP	P,T2
	HRRM	T2,BF2A
	HRRM	T2,BF2B
	POP	P,T1
	HRRM	T1,BF1A
	HRRM	T1,BF1B
				;SUPER FAST SYNTHESIZER CONVERSION. MASKS
	POP	P,PIC		;4 BIT PICTURE TO 4 DD BUFFERS ONE TO FOUR
	MOVE	Y,PCLN(PIC)	;ASSUMES DIGITIZER COMPLEMENTED GRAY CODE
        ASH	Y,1
	ADD	Y,I0
	CAILE	Y,741
	MOVEI	Y,741
	SUB	Y,I0
	ASH	Y,-1
	MOVN	Y,Y		;  VIDFRX(PIC[0],BF1,BF2,BF4,BF8,I0,J0)
	HRLZ	Y,Y
	ADD	Y,I0
	MOVE	PWID,LNBY(PIC)
	ASH	PWID,1
	ADD	PWID,J0
	CAILE	PWID,1000
	MOVEI	PWID,1000
	SUB	PWID,J0
	ASH	PWID,-5
	MOVN	PWID,PWID
	HRLZ	PWID,PWID
	ASH	J0,-5
	ADD	PWID,J0
	
	MOVE	LBP,BPTAB(PIC)
	MOVE	LBP,-1(LBP)
	ADD	LBP,LINTAB(PIC)
	
YLOOP:	MOVE	YY,SLINE(Y)
	MOVE	YY1,SLINE+1(Y)
	MOVE	BP,LBP
	ADD	LBP,LNWD(PIC)
	ADD	YY,PWID

XLOOP:	HRROI	T1,777762
	HRROI	T2,777762
	HRROI	T4,777762
	HRROI	T8,777762

   FOR C←20,0,-2
{	ILDB	TT,BP
	TRNE	TT,1
	TLZ	T1,3⊗C
	TRNE	TT,2
	TLZ	T2,3⊗C
	TRNE	TT,4
	TLZ	T4,3⊗C
	TRNE	TT,10
	TLZ	T8,3⊗C
 }

   FOR C←20,4,-2
{	ILDB	TT,BP
	TRNE	TT,1
	ANDCMI	T1,3⊗C
	TRNE	TT,2
	ANDCMI	T2,3⊗C
	TRNE	TT,4
	ANDCMI	T4,3⊗C
	TRNE	TT,10
	ANDCMI	T8,3⊗C
 }

BF1A:	MOVEM	T1,1(YY)
BF2A:	MOVEM	T2,2(YY)
BF4A:	MOVEM	T4,4(YY)
BF8A:	MOVEM	T8,8(YY)
BF1B:	MOVEM	T1,1(YY1)
BF2B:	MOVEM	T2,2(YY1)
BF4B:	MOVEM	T4,4(YY1)
BF8B:	MOVEM	T8,8(YY1)
	ADDI	YY1,1
	AOBJN	YY,XLOOP
	
	ADDI	Y,1
	AOBJN	Y,YLOOP

	JRST	@RETAD
	PRGEND
	TITLE	VIDFGX
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	ENTRY	VIDFGX

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

P←17 ↔ T1←0 T2←1 ↔ PIC←2 ↔ Y←3 ↔ LBP←4 ↔ BP←5 ↔ T4←6 ↔ TT←7 ↔ YY←10 ↔ PWID←11
YY1←I0←13 ↔ BT←J0←14 ↔ T8←15

RETAD:	0

VIDFGX:	POP	P,RETAD
	POP	P,J0
	POP	P,I0
	POP	P,T8
	HRRM	T8,BF8A
	HRRM	T8,BF8B
	POP	P,T4
	HRRM	T4,BF4A
	HRRM	T4,BF4B
	POP	P,T2
	HRRM	T2,BF2A
	HRRM	T2,BF2B
	POP	P,T1
	HRRM	T1,BF1A
	HRRM	T1,BF1B
				;SUPER FAST SYNTHESIZER CONVERSION. MASKS
	POP	P,PIC		;4 BIT PICTURE TO 4 DD BUFFERS ONE TO FOUR
	MOVE	Y,PCLN(PIC)	;ASSUMES DIGITIZER COMPLEMENTED GRAY CODE
        ASH	Y,1
	ADD	Y,I0
	CAILE	Y,741
	MOVEI	Y,741
	SUB	Y,I0
	ASH	Y,-1
	MOVN	Y,Y		;  VIDFRX(PIC[0],BF1,BF2,BF4,BF8,I0,J0)
	HRLZ	Y,Y
	ADD	Y,I0
	MOVE	PWID,LNBY(PIC)
	ASH	PWID,1
	ADD	PWID,J0
	CAILE	PWID,1000
	MOVEI	PWID,1000
	SUB	PWID,J0
	ASH	PWID,-5
	MOVN	PWID,PWID
	HRLZ	PWID,PWID
	ASH	J0,-5
	ADD	PWID,J0

        MOVEI	BT,4
	SUB	BT,BYBI(PIC)
	
	MOVE	LBP,BPTAB(PIC)
	MOVE	LBP,-1(LBP)
	ADD	LBP,LINTAB(PIC)
	
YLOOP:	MOVE	YY,SLINE(Y)
	MOVE	YY1,SLINE+1(Y)
	MOVE	BP,LBP
	ADD	LBP,LNWD(PIC)
	ADD	YY,PWID

XLOOP:	HRRZI	T1,000002
	HRRZI	T2,000002
	HRRZI	T4,000002
	HRRZI	T8,000002

   FOR C←20,0,-2
{	ILDB	TT,BP
	LSH	TT,(BT)
	TRNE	TT,1
	TLO	T1,3⊗C
	TRNE	TT,2
	TLO	T2,3⊗C
	TRNE	TT,4
	TLO	T4,3⊗C
	TRNE	TT,10
	TLO	T8,3⊗C
 }

   FOR C←20,4,-2
{	ILDB	TT,BP
	LSH	TT,(BT)
	TRNE	TT,1
	ORI	T1,3⊗C
	TRNE	TT,2
	ORI	T2,3⊗C
	TRNE	TT,4
	ORI	T4,3⊗C
	TRNE	TT,10
	ORI	T8,3⊗C
 }

BF1A:	MOVEM	T1,1(YY)
BF2A:	MOVEM	T2,2(YY)
BF4A:	MOVEM	T4,4(YY)
BF8A:	MOVEM	T8,8(YY)
BF1B:	MOVEM	T1,1(YY1)
BF2B:	MOVEM	T2,2(YY1)
BF4B:	MOVEM	T4,4(YY1)
BF8B:	MOVEM	T8,8(YY1)
	ADDI	YY1,1
	AOBJN	YY,XLOOP
	
	ADDI	Y,1
	AOBJN	Y,YLOOP

	JRST	@RETAD
	PRGEND
	TITLE	VIDFRT
	EXTERN	XL,YH,XSC,YSC
	EXTERN	SLINE,DBUF,BSK
	EXTERN	CORGET,CORREL
	ENTRY	VIDFRT

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

P←17 ↔ T1←0 T2←1 ↔ PIC←2 ↔ Y←3 ↔ LBP←4 ↔ BP←5 ↔ T4←6 ↔ TT←7 ↔ YY←10 ↔ PWID←11
I0←13 ↔ YYD←J0←14 ↔ T8←15

RETAD:	0

VIDFRT:	POP	P,RETAD
	POP	P,J0
	POP	P,I0
	POP	P,T8
	HRRM	T8,BF8A
	HRRM	T8,BF8B
	POP	P,T4
	HRRM	T4,BF4A
	HRRM	T4,BF4B
	POP	P,T2
	HRRM	T2,BF2A
	HRRM	T2,BF2B
	POP	P,T1
	HRRM	T1,BF1A
	HRRM	T1,BF1B
				;SUPER FAST SYNTHESIZER CONVERSION. MASKS
	POP	P,PIC		;4 BIT PICTURE TO 4 DD BUFFERS ONE TO ONE
	MOVE	Y,LNBY(PIC)	;ASSUMES REGULAR GRAY CODE, BUT TRANSPOSED
	ASH	Y,1
	SUB	Y,I0
	ADDI	Y,740

	CAILE	Y,740
	MOVEI	Y,740
	ASH	Y,-1

	MOVN	Y,Y		;  VID4T(PIC[0],BF1,BF2,BF4,BF8,I0,J0)
	HRLZ	Y,Y
	ADD	Y,I0

	MOVE	PWID,PCLN(PIC)
	ADD	PWID,J0
	CAILE	PWID,1000
	MOVEI	PWID,1000
	SUB	PWID,J0
	ASH	PWID,-5
	MOVN	PWID,PWID
	HRLZ	PWID,PWID
	ASH	J0,-5
	ADD	PWID,J0
	
	MOVE	LBP,BPTAB(PIC)		;first byte pntr for pic
	MOVE	LBP,-1(LBP)
	ADD	LBP,LINTAB(PIC)

	ADDI	Y,3
YLOOP:	SUBI	Y,3
	MOVE	YY,SLINE(Y)
	MOVE	YYD,SLINE-1(Y)
	ADD	YY,PWID
	ADD	YYD,PWID
	IBP	LBP
	MOVE	BP,LBP

XLOOP:	HRROI	T1,777762		;initialize DD buffer words
	HRROI	T2,777762
	HRROI	T4,777762
	HRROI	T8,777762

   FOR C←21,0,-1
{	LDB	TT,BP
	ADD	BP,LNWD(PIC)
	TRNE	TT,1
	TLZ	T1,1⊗C
	TRNE	TT,2
	TLZ	T2,1⊗C
	TRNE	TT,4
	TLZ	T4,1⊗C
	TRNE	TT,10
	TLZ	T8,1⊗C
 }

   FOR C←21,4,-1
{	LDB	TT,BP
        ADD	BP,LNWD(PIC)
	TRNE	TT,1
	ANDCMI	T1,1⊗C
	TRNE	TT,2
	ANDCMI	T2,1⊗C
	TRNE	TT,4
	ANDCMI	T4,1⊗C
	TRNE	TT,10
	ANDCMI	T8,1⊗C
 }

BF1A:	MOVEM	T1,1(YYD)
BF2A:	MOVEM	T2,2(YYD)
BF4A:	MOVEM	T4,4(YYD)
BF8A:	MOVEM	T8,10(YYD)
BF1B:	MOVEM	T1,1(YY)
BF2B:	MOVEM	T2,2(YY)
BF4B:	MOVEM	T4,4(YY)
BF8B:	MOVEM	T8,10(YY)
	ADDI	YYD,1
	AOBJN	YY,XLOOP

	AOBJN	Y,YLOOP

	JRST	@RETAD
	PRGEND
	TITLE	VIDXGP
	ENTRY	VIDXGP
        EXTERN	XGEROR

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

NCOPY←10 ↔ P←17 ↔ I0←1 ↔ J0←2 ↔ Y←3 YC←4 ↔ PIC←5 ↔ A←6 ↔ PLEN←7

RETAD:	0

LIST:	IOWD	2,TOP
	IOWD	0,0
	IOWD	2,BOT
	0

TOP:	400000,,0
	0
BOT:	0
	400000,,0

VIDXGP: 
	POP	P,RETAD		;treat a picture as a bit buffer for XGP output
	POP	P,NCOPY
	POP	P,PLEN
	POP	P,J0		; VIDXGP(PIC,I0,J0,PLEN)
	POP	P,I0		;starts I0 xgp scanlines down the page
	POP	P,PIC		; J0 indented right. Page is PLEN long.

	HRLZ	Y,I0
	LSH	Y,=6
	MOVEM	Y,TOP+1

	MOVE	Y,PLEN
	SUB	Y,PCLN(PIC)
	SUB	Y,I0
	CAIGE	Y,0
	MOVEI	Y,0
	LSH	Y,=24
	MOVEM	Y,BOT
	
	MOVN	Y,PCWD(PIC)
	HRLZ	Y,Y
	HRR	Y,LINTAB(PIC)
	SUBI	Y,1
	MOVEM	Y,LIST+1

	ADDI	J0,=36
	ORI	J0,10000
	LSH	J0,=12
	ADD	J0,LNWD(PIC)
	SUBI	J0,1

	MOVE	YC,PCLN(PIC)
	MOVE	Y,LINTAB(PIC)

YLOOP:	MOVEM	J0,(Y)
	ADD	Y,LNWD(PIC)
	SOJG	YC,YLOOP

FINSH1:	CHNSTS	1,A
	JUMPE	A,.+3
	IOPUSH	1,1
	JRST	[OUTSTR [ASCIZ \ Too many IOPUSHes (XGPUP) \] ↔ JRST BADX]

	INIT	1,617		;return if xgp not availible
	SIXBIT	/XGP/
	0
        JRST   NOXG		;not available
        JRST   XGAV
NOXG:  OUTSTR [ASCIZ / Waiting for XGP .. /]

	INIT 1,1217		;automatic wait for device, HNGTRP
	SIXBIT /xgp/		
	0
	JRST [OUTSTR [ASCIZ \ XGP trouble (INIT) \] ↔ JRST BADG]]

XGAV:	OUT	1,LIST
	JRST	[SOJG NCOPY,XGAV ↔ JRST FIXG]
	OUTSTR  [ASCIZ \ XGP error: \]
	SETZ	0,
	MTAPE	1,0
        OUTSTR  @XGEROR(1)
        OUTSTR	[ASCIZ\
\]
BADG:   RELEAS  1,
	JUMPE   A,.+3
	IOPOP   1,1
	JRST    .+1
BADX:	SETZ	1,
	JRST    @RETAD

FIXG:   RELEAS  1,
	JUMPE   A,.+3
	IOPOP   1,1
	JRST    .+1
	SETO	1,
	JRST    @RETAD

	PRGEND
	TITLE	VIDXG
	ENTRY	VIDXG
        EXTERN	XGEROR

	PCLN←←0
	PCWD←←1
	PCBY←←2
	PCBYA←←3
	LNWD←←4
	LNBY←←5
	LNBYA←←6
	WDBY←←7
	WDBI←←10
	BYBI←←11
	BMAX←←12
	BPTAB←←13
	LINTAB←←14

NCOPY←10 ↔ P←17 ↔ I0←1 ↔ J0←2 ↔ Y←3 YC←4 ↔ PIC←5 ↔ A←6 ↔ PLEN←7

RETAD:	0

LIST:	IOWD	2,TOP
	IOWD	0,0
	IOWD	2,BOT
	0

TOP:	400000,,0
	0
BOT:	0
	400000,,0

VIDXG:	
	POP	P,RETAD		;treat a picture as a bit buffer for XGP output
	POP	P,NCOPY
	POP	P,PLEN
	POP	P,J0		; VIDXGP(PIC,I0,J0,PLEN)
	POP	P,I0		;starts I0 xgp scanlines down the page
	POP	P,PIC		; J0 indented right. Page is PLEN long.

	HRLZ	Y,I0
	LSH	Y,=6
	MOVEM	Y,TOP+1

	MOVE	Y,PLEN
	SUB	Y,PCLN(PIC)
	SUB	Y,I0
	CAIGE	Y,0
	MOVEI	Y,0
	LSH	Y,=24
	MOVEM	Y,BOT
	
	MOVN	Y,PCWD(PIC)
	HRLZ	Y,Y
	HRR	Y,LINTAB(PIC)
	SUBI	Y,1
	MOVEM	Y,LIST+1

	ADDI	J0,=36
	ORI	J0,10000
	LSH	J0,=12
	ADD	J0,LNWD(PIC)
	SUBI	J0,1

	MOVE	YC,PCLN(PIC)
	MOVE	Y,LINTAB(PIC)

YLOOP:	MOVEM	J0,(Y)
	ADD	Y,LNWD(PIC)
	SOJG	YC,YLOOP

FINSH1:	CHNSTS	1,A
	JUMPE	A,.+3
	IOPUSH	1,1
	JRST	[OUTSTR [ASCIZ \ Too many IOPUSHes (XGPUP) \] ↔ JRST IOPU]

	INIT	1,617		;return if xgp not availible
	SIXBIT	/XGP/
	0
        JRST   NOXG		;not available
        JRST   XGAV

XGAV:	OUT	1,LIST
	JRST	[SOJG NCOPY,XGAV ↔ JRST FIXG]
	OUTSTR [ASCIZ \ XGP error: \]
	SETZ	0,
	MTAPE	1,0
	OUTSTR	@XGEROR(1)
        OUTSTR	[ASCIZ\
\]
NOXG:	RELEAS  1,
	JUMPE   A,.+3
	IOPOP   1,1
	JRST    .+1
IOPU:   SETZ	1,
	JRST    @RETAD

FIXG:   RELEAS  1,
	JUMPE   A,.+3
	IOPOP   1,1
	JRST    .+1
        SETO	1,
	JRST    @RETAD

	PRGEND 
        TITLE	XGEROR
        ENTRY XGEROR
XGEROR:	[ASCIZ \No error after all?\]
	[ASCIZ \Font Compiler: No Job slots\]
	[ASCIZ \Font Compiler: No response\]
	[ASCIZ \Font Compiler: No response\]
	[ASCIZ \Font Compiler: Illegal response\]
	[ASCIZ \Interrupt level: Data missed\]
	[ASCIZ \XGP Hung timeout\]
	[ASCIZ \Illegal mode\]
	[ASCIZ \Line too complex\]
	[ASCIZ \Out of order\]
	[ASCIZ \XGPSER missed\]
	[ASCIZ \Page too long\]
	[ASCIZ \Illegal vector parameters\]
	[ASCIZ \Font compiler disappeared\]
	END